package com.ittao.taoaicodecommon.manage.storage.service.impl;

import com.ittao.taoaicodecommon.config.AppStorageConfig;
import com.ittao.taoaicodecommon.manage.storage.service.CosOperationService;
import com.ittao.taoaicodecommon.manage.storage.service.OperationTypeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import jakarta.annotation.Resource;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.regex.Pattern;

/**
 * 操作类型判断服务实现类
 * 用于判断文件操作是否为修改操作（相对于初次生成）
 */
@Slf4j
@Service
public class OperationTypeServiceImpl implements OperationTypeService {

    @Resource
    private AppStorageConfig appStorageConfig;

    @Resource
    private CosOperationService cosOperationService;

    /**
     * 判断是否为修改操作
     * 优先级：目录判断 > COS文件判断 > 对话历史判断
     * @param filePath 文件路径
     * @param appId 应用ID
     * @return 是否为修改操作
     */
    @Override
    public boolean isModificationOperation(String filePath, Long appId) {
        try {
            // 优先级1：基于本地目录判断
            Path localFile = Paths.get(filePath);
            if (Files.exists(localFile)) {
                log.debug("本地临时文件已存在，判断为修改操作: {}", filePath);
                return true;
            }

            // 优先级2：基于COS文件存在性判断
            String cosKey = buildCosKeyFromLocalPath(filePath);
            String projectCosKey = extractProjectCosKey(cosKey);
            if (projectCosKey != null && cosOperationService.fileExists(projectCosKey)) {
                log.debug("COS中项目文件已存在，判断为修改操作: {}", projectCosKey);
                return true;
            }

            log.debug("判断为初次生成操作: {}", filePath);
            return false;
        } catch (Exception e) {
            log.warn("判断操作类型失败，默认为初次生成: {}", filePath, e);
            return false;
        }
    }

    /**
     * 从本地路径构建COS key
     * @param localPath 本地路径
     * @return COS key
     */
    @Override
    public String buildCosKeyFromLocalPath(String localPath) {
        try {
            String tempBasePath = System.getProperty("user.dir") + appStorageConfig.getCos().getTempDirPath();
            
            if (localPath.startsWith(tempBasePath)) {
                String relativePath = localPath.substring(tempBasePath.length());
                if (relativePath.startsWith(File.separator)) {
                    relativePath = relativePath.substring(File.separator.length());
                }
                
                // 标准化路径分隔符为 /
                String cosKey = "userApp/" + relativePath.replace(File.separator, "/");
                log.debug("构建COS key: {} -> {}", localPath, cosKey);
                return cosKey;
            }
            
            log.warn("路径不在临时目录范围内: {}", localPath);
            return null;
        } catch (Exception e) {
            log.error("构建COS key失败: {}", localPath, e);
            return null;
        }
    }

    /**
     * 从COS key提取项目级别的key
     * COS key格式：userApp/{userId}/code_output/{projectName}/{具体文件}
     * 项目key格式：userApp/{userId}/code_output/{projectName}
     * @param cosKey COS key
     * @return 项目级别的COS key
     */
    @Override
    public String extractProjectCosKey(String cosKey) {
        try {
            if (cosKey == null) {
                return null;
            }
            
            String[] parts = cosKey.split("/");
            if (parts.length >= 4 && "userApp".equals(parts[0]) && "code_output".equals(parts[2])) {
                // userApp/{userId}/code_output/{projectName}
                return String.join("/", parts[0], parts[1], parts[2], parts[3]);
            }
            return null;
        } catch (Exception e) {
            log.error("提取项目COS key失败: {}", cosKey, e);
            return null;
        }
    }

    /**
     * 从文件路径提取会话ID（用于缓存管理）
     * @param filePath 文件路径
     * @return 会话ID
     */
    @Override
    public String extractSessionIdFromPath(String filePath) {
        try {
            // 从路径中提取userId作为sessionId
            String tempBasePath = System.getProperty("user.dir") + appStorageConfig.getCos().getTempDirPath();

            if (filePath.startsWith(tempBasePath)) {
                String relativePath = filePath.substring(tempBasePath.length());
                if (relativePath.startsWith(File.separator)) {
                    relativePath = relativePath.substring(File.separator.length());
                }

                String[] parts = relativePath.split(Pattern.quote(File.separator));
                if (parts.length > 0) {
                    return parts[0]; // userId作为sessionId
                }
            }

            return null;
        } catch (Exception e) {
            log.error("提取会话ID失败: {}", filePath, e);
            return null;
        }
    }

    /**
     * 从文件路径提取用户ID
     * @param filePath 文件路径
     * @return 用户ID
     */
    @Override
    public String extractUserIdFromPath(String filePath) {
        // 在当前实现中，sessionId就是userId
        return extractSessionIdFromPath(filePath);
    }
}